home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / FH-3DTUT.ZIP / TUTUNIT.PAS < prev   
Pascal/Delphi Source File  |  1995-12-24  |  10KB  |  461 lines

  1. {$A+,G+,R-,S-}
  2. UNIT TUTUNIT; {Unit by THEFAKER (C) 1994,
  3.                Cutted by fh94.3 (C) 1995 (Sorry THEFAKER)}
  4.  
  5. INTERFACE
  6.  
  7. PROCEDURE SetPixel(X,Y:Word; C:Byte);
  8. FUNCTION GetPixel(X,Y:Word):Byte;
  9. PROCEDURE DrawLineH(X1,X2,Y1:Word; C:Byte);
  10. PROCEDURE DrawLineV(X1,Y1,Y2:Word; C:Byte);
  11. PROCEDURE DrawLine(X1,Y1,X2,Y2:Integer; C:Byte);
  12. PROCEDURE SetColor(Nr,R,G,B:Byte);
  13. PROCEDURE GetColor(Nr:Byte; VAR R,G,B:Byte);
  14. PROCEDURE Fill(X,Y:Integer; C:Byte);
  15. PROCEDURE Flood(X,Y:Integer; C,C2:Byte);
  16. PROCEDURE ClearScreen;
  17. PROCEDURE MCGAOn;
  18. PROCEDURE MCGAOff;
  19.  
  20. IMPLEMENTATION
  21. VAR
  22.    OldMode:Byte;
  23.  
  24. PROCEDURE SetPixel(X,Y:Word; C:Byte);
  25. BEGIN
  26.      ASM
  27.         mov ax,$a000
  28.         mov es,ax
  29.         mov bx,x
  30.         mov dx,y
  31.         xchg dh,dl
  32.         mov al,c
  33.         mov di,dx
  34.         shr di,1
  35.         shr di,1
  36.         add di,dx
  37.         add di,bx
  38.         stosb
  39.      END;
  40. END;
  41.  
  42. FUNCTION GetPixel(X,Y:Word):Byte;
  43. BEGIN
  44.      ASM
  45.         mov ax,$a000
  46.         mov es,ax
  47.         mov bx,x
  48.         mov dx,y
  49.         mov di,dx
  50.         shl di,1
  51.         shl di,1
  52.         add di,dx
  53.         mov cl,6
  54.         shl di,cl
  55.         add di,bx
  56.         mov al,es:[di]
  57.         mov [bp-1],al
  58.      END;
  59. END;
  60.  
  61. PROCEDURE DrawLineH(X1,X2,Y1:Word; C:Byte);
  62. BEGIN
  63.      ASM
  64.         mov ax,$a000
  65.         mov es,ax
  66.         mov ax,y1
  67.         mov di,ax
  68.         shl di,1
  69.         shl di,1
  70.         add di,ax
  71.         mov cl,6
  72.         shl di,cl
  73.         mov bx,x1
  74.         mov dx,x2
  75.         cmp bx,dx
  76.         jl @1
  77.         xchg bx,dx
  78. @1:     inc dx
  79.         add di,bx
  80.         mov cx,dx
  81.         sub cx,bx
  82.         shr cx,1
  83.         mov al,c
  84.         mov ah,al
  85.         ror bx,1
  86.         jnb @2
  87.         stosb
  88.         ror dx,1
  89.         jnb @3
  90.         dec cx
  91. @3:     rol dx,1
  92. @2:     rep
  93.         stosw
  94.         ror dx,1
  95.         jnb @4
  96.         stosb
  97. @4:
  98.      END;
  99. END;
  100.  
  101. PROCEDURE ClearScreen;
  102. BEGIN
  103.      PortW[$3C4]:=$0F02;
  104.      ASM
  105.         mov ax,$a000
  106.         mov es,ax
  107.         mov cx,16383
  108.         db $66
  109.         xor ax,ax
  110.         xor di,di
  111.         cld
  112.         db $66
  113.         rep stosw
  114.      END;
  115. END;
  116.  
  117. PROCEDURE DrawLineV(X1,Y1,Y2:Word; C:Byte);
  118. BEGIN
  119.      ASM
  120.         mov ax,x1
  121.         mov bx,y1
  122.         mov dx,y2
  123.         cmp bx,dx
  124.         jl @1
  125.         xchg bx,dx
  126. @1:     mov di,bx
  127.         shl di,1
  128.         shl di,1
  129.         add di,bx
  130.         mov cl,6
  131.         shl di,cl
  132.         add di,ax
  133.         mov cx,$a000
  134.         mov es,cx
  135.         mov cx,dx
  136.         sub cx,bx
  137.         inc cx
  138.         mov al,c
  139.         mov bx,$13f
  140. @2:     stosb
  141.         add di,bx
  142.         loop @2
  143.      END;
  144. END;
  145.  
  146. PROCEDURE DrawLine(X1,Y1,X2,Y2:Integer; C:Byte);
  147. BEGIN
  148.      ASM
  149.         mov al,c
  150.         xor ah,ah
  151.         mov si,ax
  152.         mov ax,x1
  153.         cmp ax,319
  154.         ja @Ende
  155.         mov bx,x2
  156.         cmp bx,319
  157.         ja @Ende
  158.         mov cx,y1
  159.         cmp cx,199
  160.         ja @Ende
  161.         mov dx,y2
  162.         cmp dx,199
  163.         ja @Ende
  164.         cmp ax,bx
  165.         jnz @weiter
  166.         cmp cx,dx
  167.         jnz @vertical
  168.         push ax
  169.         push cx
  170.         push si
  171.         call setpixel
  172.         jmp @ende
  173. @weiter:cmp cx,dx
  174.         jnz @weiter2
  175.         push ax
  176.         push bx
  177.         push cx
  178.         push si
  179.         call drawlineh
  180.         jmp @ende
  181. @vertical:push ax
  182.         push cx
  183.         push dx
  184.         push si
  185.         call drawlinev
  186.         jmp @ende
  187. @weiter2:cmp cx,dx
  188.         jbe @1
  189.         xchg cx,dx
  190.         xchg ax,bx
  191. @1:     mov di,cx
  192.         shl di,1
  193.         shl di,1
  194.         add di,cx
  195.         push si
  196.         mov si,bx
  197.         mov bx,dx
  198.         sub bx,cx
  199.         mov cl,06
  200.         shl di,cl
  201.         add di,ax
  202.         mov dx,si
  203.         pop si
  204.         sub dx,ax
  205.         mov ax,$a000
  206.         mov es,ax
  207.         mov ax,si
  208.         push bp
  209.         or dx,0
  210.         jge @jmp1
  211.         neg dx
  212.         cmp dx,bx
  213.         jbe @jmp3
  214.         mov cx,dx
  215.         inc cx
  216.         mov si,dx
  217.         shr si,1
  218.         std
  219.         mov bp,320
  220. @1c:    stosb
  221. @1b:    or si,si
  222.         jge @1a
  223.         add di,bp
  224.         add si,dx
  225.         jmp @1b
  226. @1a:    sub si,bx
  227.         loop @1c
  228.         jmp @Ende2
  229. @jmp3:  mov cx,bx
  230.         inc cx
  231.         mov si,bx
  232.         neg si
  233.         sar si,1
  234.         cld
  235.         mov bp,319
  236. @2c:    stosb
  237. @2b:    or si,si
  238.         jl @2a
  239.         sub si,bx
  240.         dec di
  241.         jmp @2b
  242. @2a:    add di,bp
  243.         add si,dx
  244.         loop @2c
  245.         jmp @Ende2
  246. @jmp1:  cmp dx,bx
  247.         jbe @jmp4
  248.         mov cx,dx
  249.         inc cx
  250.         mov si,dx
  251.         shr si,1
  252.         cld
  253.         mov bp,320
  254. @3c:    stosb
  255. @3b:    or si,si
  256.         jge @3a
  257.         add di,bp
  258.         add si,dx
  259.         jmp @3b
  260. @3a:    sub si,bx
  261.         loop @3c
  262.         jmp @Ende2
  263. @jmp4:  mov cx,bx
  264.         inc cx
  265.         mov si,bx
  266.         neg si
  267.         sar si,1
  268.         std
  269.         mov bp,321
  270. @4c:    stosb
  271. @4b:    or si,si
  272.         jl @4a
  273.         sub si,bx
  274.         inc di
  275.         jmp @4b
  276. @4a:    add di,bp
  277.         add si,dx
  278.         loop @4c
  279. @Ende2: pop bp
  280.         cld
  281. @Ende:
  282.      END;
  283. END;
  284.  
  285. PROCEDURE SetColor(Nr,R,G,B:Byte);
  286. BEGIN
  287.      Port[$3C8]:=Nr;
  288.      Port[$3C9]:=R;
  289.      Port[$3C9]:=G;
  290.      Port[$3C9]:=B;
  291. END;
  292.  
  293. PROCEDURE GetColor(Nr:Byte; VAR R,G,B:Byte);
  294. BEGIN
  295.      Port[$3C7]:=Nr;
  296.      R:=Port[$3C9];
  297.      G:=Port[$3C9];
  298.      B:=Port[$3C9];
  299. END;
  300.  
  301. PROCEDURE Fill(X,Y:Integer; C:Byte);
  302. VAR
  303.    C2:Byte;
  304.  
  305.    PROCEDURE Suchen(L,R,Y:Integer; UpDown:Byte);
  306.    VAR
  307.       X,X2:Integer;
  308.    BEGIN
  309.         IF GetPixel(L,Y)=C2 THEN
  310.            WHILE (L>0) AND (GetPixel(L-1,Y)=C2) DO
  311.                  Dec(L);
  312.         X:=L;
  313.         IF GetPixel(R,Y)=C2 THEN
  314.            WHILE (R<319) AND (GetPixel(R+1,Y)=C2) DO
  315.                  Inc(R);
  316.         WHILE X<=R DO
  317.         BEGIN
  318.              X2:=X;
  319.              IF GetPixel(X,Y)=C2 THEN
  320.              BEGIN
  321.                   WHILE (GetPixel(X+1,Y)=C2) AND (X<319) DO
  322.                         Inc(X);
  323.                   DrawLineH(X2,X,Y,C);
  324.                   IF UpDown=2 THEN
  325.                   BEGIN
  326.                        IF Y>0 THEN
  327.                           Suchen(X2,X,Y-1,2);
  328.                        IF Y<199 THEN
  329.                           IF (L>X2) AND (R<X) THEN
  330.                           BEGIN
  331.                                Suchen(X2,L-1,Y+1,1);
  332.                                Suchen(R+1,X,Y+1,1);
  333.                           END
  334.                           ELSE
  335.                           IF (L<=X2) AND (R<X) THEN
  336.                              Suchen(R+1,X,Y+1,1)
  337.                           ELSE
  338.                           IF (L>X2) AND (R>=X) THEN
  339.                              Suchen(X2,L-1,Y+1,1);
  340.                   END;
  341.                   IF UpDown=1 THEN
  342.                   BEGIN
  343.                        IF Y<199 THEN
  344.                           Suchen(X2,X,Y+1,1);
  345.                        IF Y>0 THEN
  346.                           IF (L>X2) AND (R<X) THEN
  347.                           BEGIN
  348.                                Suchen(X2,L-1,Y-1,2);
  349.                                Suchen(R+1,X,Y-1,2);
  350.                           END
  351.                           ELSE
  352.                           IF (L<=X2) AND (R<X) THEN
  353.                              Suchen(R+1,X,Y-1,2)
  354.                           ELSE
  355.                           IF (L>X2) AND (R>=X) THEN
  356.                              Suchen(X2,L-1,Y-1,2);
  357.                   END;
  358.              END;
  359.              Inc(X);
  360.         END;
  361.    END;
  362.  
  363. BEGIN
  364.      C2:=GetPixel(X,Y);
  365.      IF Y<>0 THEN
  366.         Dec(Y);
  367.      Suchen(X,X,Y,2);
  368.      Suchen(X,X,Y+1,1);
  369. END;
  370.  
  371. PROCEDURE Flood(X,Y:Integer; C,C2:Byte);
  372.  
  373.    PROCEDURE Suchen(L,R,Y:Integer; UpDown:Byte);
  374.    VAR
  375.       X,X2:Integer;
  376.    BEGIN
  377.         IF GetPixel(L,Y)<>C2 THEN
  378.            WHILE (L>0) AND (GetPixel(L-1,Y)<>C2) DO
  379.                  Dec(L);
  380.         X:=L;
  381.         IF GetPixel(R,Y)<>C2 THEN
  382.            WHILE (R<319) AND (GetPixel(R+1,Y)<>C2) DO
  383.                  Inc(R);
  384.         WHILE X<=R DO
  385.         BEGIN
  386.              X2:=X;
  387.              IF GetPixel(X,Y)<>C2 THEN
  388.              BEGIN
  389.                   WHILE (GetPixel(X+1,Y)<>C2) AND (X<319) DO
  390.                         Inc(X);
  391.                   DrawLineH(X2,X,Y,C);
  392.                   IF UpDown=2 THEN
  393.                   BEGIN
  394.                        IF Y>0 THEN
  395.                           Suchen(X2,X,Y-1,2);
  396.                        IF Y<199 THEN
  397.                           IF (L>X2) AND (R<X) THEN
  398.                           BEGIN
  399.                                Suchen(X2,L-1,Y+1,1);
  400.                                Suchen(R+1,X,Y+1,1);
  401.                           END
  402.                           ELSE
  403.                           IF (L<=X2) AND (R<X) THEN
  404.                              Suchen(R+1,X,Y+1,1)
  405.                           ELSE
  406.                           IF (L>X2) AND (R>=X) THEN
  407.                              Suchen(X2,L-1,Y+1,1);
  408.                   END;
  409.                   IF UpDown=1 THEN
  410.                   BEGIN
  411.                        IF Y<199 THEN
  412.                           Suchen(X2,X,Y+1,1);
  413.                        IF Y>0 THEN
  414.                           IF (L>X2) AND (R<X) THEN
  415.                           BEGIN
  416.                                Suchen(X2,L-1,Y-1,2);
  417.                                Suchen(R+1,X,Y-1,2);
  418.                           END
  419.                           ELSE
  420.                           IF (L<=X2) AND (R<X) THEN
  421.                              Suchen(R+1,X,Y-1,2)
  422.                           ELSE
  423.                           IF (L>X2) AND (R>=X) THEN
  424.                              Suchen(X2,L-1,Y-1,2);
  425.                   END;
  426.              END;
  427.              Inc(X);
  428.         END;
  429.    END;
  430.  
  431. BEGIN
  432.      IF Y<>0 THEN
  433.         Dec(Y);
  434.      Suchen(X,X,Y,2);
  435.      Suchen(X,X,Y+1,1);
  436. END;
  437.  
  438. PROCEDURE MCGAOn;
  439. BEGIN
  440.      ASM
  441.         mov ah,$f
  442.         int $10
  443.         mov [offset oldmode],al
  444.      END;
  445.      ASM
  446.         mov ax,$13
  447.         int $10
  448.      END;
  449. END;
  450.  
  451. PROCEDURE MCGAOff;
  452. BEGIN
  453.      ASM
  454.         mov al,[offset oldmode]
  455.         xor ah,ah
  456.         int $10
  457.      END;
  458. END;
  459.  
  460. END.
  461.